iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0

Coroutine(協程)可以看作輕量級的 thread(執行緒),執行緒是作業系統負責調度,協程則是應用程式負責調度,因為少了 system call 等步驟,切換的開銷比起執行緒小。

Android Coroutine Scope

非同步執行遇上生命週期變得更複雜,可能在背景下載到一半手機螢幕熄掉,APP 在背景被中止,這時候就應該取消下載的協程,好在 Android Kotlin extension 已經幫我們處理好。

Android KTX 官方文件

  • Lifecycle 元件(Activity 等等) 有 lifecycleScope
  • ViewModel 有 viewModelScope

UI blocking & Dispatcher

程式預設跑在主執行緒上,處理程式 UI 也不例外,如果在主執行緒上執行非常耗時的工作,就會無法處理 UI 互動,導致傳說中的「應用程式沒有回應 (ANR)」

為了不阻塞 UI 互動,需要使用不同的調度器(Dispatcher)把協程綁定到不同的執行緒,預設有 DefaultMainIO 三種 Dispatcher,Unconfined 很少用到。
launch() 傳入 Dispatchers.IO 就能讓協程綁定在不同於 UI 的執行緒。

class CourseSearchViewModel(
    private val repo: FcuRepository
) : ViewModel(), KoinComponent {

    var state by mutableStateOf(SearchFilter(111, 1))
        private set
    
    fun search(dispatcher: CoroutineDispatcher = Dispatchers.IO) {
        val filter = state.copy()
        viewModelScope.launch(dispatcher) {
            repo.search(filter)?.let { result = it.postFilter(filter) }
        }
    }
}

上一篇
Day 16 - UI Navigation
下一篇
Day 18 - HTTP API Client
系列文
關於我用 Compose UI 造新輪子這檔事24
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言